package it.rikesh.aip2011.client.component;

import java.util.ArrayList;
import java.util.List;


import it.rikesh.aip2011.client.BaseLayout;
import it.rikesh.aip2011.client.service.FaunaFloraService;
import it.rikesh.aip2011.client.service.FaunaFloraServiceAsync;
import it.rikesh.aip2011.client.service.HutService;
import it.rikesh.aip2011.client.service.HutServiceAsync;
import it.rikesh.aip2011.client.service.TrailService;
import it.rikesh.aip2011.client.service.TrailServiceAsync;
import it.rikesh.aip2011.shared.model.Hut;
import it.rikesh.aip2011.shared.model.Trail;

import com.extjs.gxt.ui.client.event.BaseEvent;
import com.extjs.gxt.ui.client.event.ButtonEvent;
import com.extjs.gxt.ui.client.event.Events;
import com.extjs.gxt.ui.client.event.Listener;
import com.extjs.gxt.ui.client.event.SelectionListener;
import com.extjs.gxt.ui.client.widget.Info;
import com.extjs.gxt.ui.client.widget.LayoutContainer;
import com.extjs.gxt.ui.client.widget.Text;
import com.extjs.gxt.ui.client.widget.button.Button;
import com.extjs.gxt.ui.client.widget.form.SimpleComboBox;
import com.extjs.gxt.ui.client.widget.form.TextArea;
import com.extjs.gxt.ui.client.widget.form.TextField;
import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Image;

/**
 * Questa classe ci permette di inserire nuovi contenuti nel datastore
 * 
 * @author  RN
 */
public class AddEditContentLayout extends LayoutContainer{
    private static HutServiceAsync hutService = GWT.create(HutService.class);
    private static TrailServiceAsync trailService = GWT.create(TrailService.class);
    private static FaunaFloraServiceAsync faunaService = GWT.create(FaunaFloraService.class);
    private Text txtIns;
    private Text txtName;
    private Text txtDDescription;
    private Text txtType;
    private Text txtHut;
    private Text txtTrail;
    private Image image;
    private TextArea taDDescription;
    private TextField<String> tfName;
    private TextField<String> tfTitle;
    private Button btnSelect;
    private Button btnSave;
    private SimpleComboBox<String> scbEntity;
    private SimpleComboBox<String> scbType;
    private SimpleComboBox<String> scbHut;
    private SimpleComboBox<String> scbTrail;
    private int index1;
    private int indexType;
    private int indexHut;
    private int indexTrail;
    private final String[] ENTITY={"Sentiero","Fauna/Flora"};
    private final String[] TYPE={"Fauna","Flora"};
    private List<String> huts;
    private List<String> trails;
    
    //Definisco i due listener per i due pulsanti
    SelectionListener<ButtonEvent> slSelect = new SelectionListener<ButtonEvent>() {  

        @Override  
        public void componentSelected(ButtonEvent ce) {  
            if(ENTITY[index1].equals("Fauna/Flora")){
                createFromFFauna();
            }else if(ENTITY[index1].equals("Sentiero")){
                createFormSentiero();
            }
        }  
    };
    
    SelectionListener<ButtonEvent> slSave = new SelectionListener<ButtonEvent>() {  

        @Override  
        public void componentSelected(ButtonEvent ce) {  
            if(ENTITY[index1].equals("Fauna/Flora")){
                saveFaunaFlora(tfName.getValue(), taDDescription.getValue(), image.getUrl(), TYPE[indexType], trails.get(indexTrail));
            }else if(ENTITY[index1].equals("Sentiero")){
                saveTrail(tfName.getFieldLabel(), tfTitle.getFieldLabel(), taDDescription.getFieldLabel(), image.getUrl(), huts.get(indexHut));
            }  

        }  
    };
    
    public AddEditContentLayout(){
        setInit();
        getHuts();
        getTrailList();
        
    }
    
    /**
     * Crea la form per l'inserimento dei dati del sentiero
     */
    private void createFormSentiero(){
        image=new Image();
        txtName=new Text("Nome/Titolo");
        txtDDescription=new Text("Descrizione");
        txtHut=new Text("Rifugio");
        tfName=new TextField<String>();
        tfName.setEmptyText("Inserire il nome");
        tfName.setAllowBlank(false);
        tfName.setWidth(400);
        tfName.setMinLength(4);

        taDDescription=new TextArea();
        taDDescription.setWidth(400);
        taDDescription.setEmptyText("Inserire i dettagli");
        taDDescription.setAllowBlank(false);
        
        scbHut=new SimpleComboBox<String>();
        scbHut.setWidth(400);
        
        //definisco un listener per gestire la selezione nel comboBox
        scbHut.addListener(Events.SelectionChange, new Listener<BaseEvent>(){
            public void handleEvent(BaseEvent be) {
                indexHut=scbHut.getSelectedIndex();
          }
        });
        for (String hut : huts) {
            scbHut.add(hut);
        }
        
        btnSave=new Button("Salva",slSave);
        
        //Aggiungo i widget creati
        removeAll();
        
        add(txtName);
        add(tfName);
        add(txtDDescription);
        add(taDDescription);
        add(txtHut);
        add(scbHut);
        add(image);
        add(btnSave);
        layout();
    }
    
    /**
     * Crea la form per l'inserimento dei dati della fauna/flora
     */
    private void createFromFFauna(){
        image=new Image();
        txtName=new Text("Nome/Titolo");
        txtDDescription=new Text("Dettagli");
        txtType=new Text("Tipo");
        txtTrail=new Text("Sentiero");
        tfName=new TextField<String>();
        tfName.setWidth(400);
        tfName.setEmptyText("Inserire il nome");
        tfName.setAllowBlank(false);
        tfName.setMinLength(4);

        taDDescription=new TextArea();
        taDDescription.setWidth(400);
        taDDescription.setEmptyText("Inserire i dettagli");
        taDDescription.setAllowBlank(false);
        
        scbType=new SimpleComboBox<String>();
        scbType.setWidth(400);
        //definisco un listener per gestire la selezione nel comboBox
        scbType.addListener(Events.SelectionChange, new Listener<BaseEvent>(){
            public void handleEvent(BaseEvent be) {
                indexType=scbType.getSelectedIndex();
          }
        });
        scbType.add("Fauna");
        scbType.add("Flora");
        
        scbTrail=new SimpleComboBox<String>();
        scbTrail.setWidth(50);
        
        //definisco un listener per gestire la selezione nel comboBox
        scbTrail.addListener(Events.SelectionChange, new Listener<BaseEvent>(){
            public void handleEvent(BaseEvent be) {
                indexTrail=scbTrail.getSelectedIndex();
          }
        });
        for (String trail : trails) {
            scbTrail.add(trail);
        }
        btnSave=new Button("Salva",slSave);
        
        removeAll();
        
        add(txtName);
        add(tfName);
        add(txtType);
        add(scbType);
        add(txtDDescription);
        add(taDDescription);
        add(txtTrail);
        add(scbTrail);
        add(btnSave);
        layout();
    }
    
    /**
     * Metodo usato per inizializzare la combo box
     */
    private void setInit(){
        txtIns=new Text("Seleziona il tipo di entità da inserire.");
        scbEntity=new SimpleComboBox<String>();
        //definisco un listener per gestire la selezione nel comboBox
        scbEntity.addListener(Events.SelectionChange, new Listener<BaseEvent>(){
            public void handleEvent(BaseEvent be) {
                index1=scbEntity.getSelectedIndex();
          }
        });
        for (String en : ENTITY) {
            scbEntity.add(en);
        }
        
        scbEntity.setEmptyText("Seleziona...");
        btnSelect=new Button("Seleziona",slSelect);
        
        //Aggiungo i widget
        add(txtIns);
        add(scbEntity);
        add(btnSelect);

    }
    
    /**
     * Si occupa di reperire gli hut dal datastore
     */
    public void getHuts(){
        hutService.getHutList(new AsyncCallback<List<Hut>>() {
            
            public void onSuccess(List<Hut> result) {
                huts=new ArrayList<String>();
                for (Hut hut : result) {
                    huts.add(hut.getName());
                }
                
            }
            
            public void onFailure(Throwable caught) {
                
            }
        });
    }
    
    /**
     * Si occupa di reperire i trail dal datastore
     */
    public void getTrailList(){
        trailService.getTrailList(new AsyncCallback<List<Trail>>() {
            
            public void onSuccess(List<Trail> result) {
                trails=new ArrayList<String>();
                for (Trail trail : result) {
                    trails.add(trail.getName());
                }
                
            }
            
            public void onFailure(Throwable caught) {
                
            }
        });
    }
    
    /**
     * Metodo usato per salvare i dati sul datastore chiamando il service
     * @param name nome del percorso
     * @param title titolo da visualizzare
     * @param dDescription descrizione dettagliata
     * @param img path dell'immagine
     * @param hut nome del rifugio collegato.
     */
    private void saveTrail(String name,String title,String dDescription,String img,String hut){
        trailService.setTrail(name, dDescription, hut, new AsyncCallback<String>() {
            
            public void onSuccess(String result) {
                Info.display("Informazione", "Salvataggio eseguito correttamente"); 
                BaseLayout.refreshMenu();
                BaseLayout.changeContent(new HomeLayout());
            }
            
            public void onFailure(Throwable caught) {
                
            }
        });
    }
    
    /**
     * Metodo usato per salvare i dati sul datastore chiamando il service
     * @param name nome
     * @param detail descrizione
     * @param img path dell'immagine
     * @param type tipo: fauna, flora
     * @param trail nome del sentiero
     */
    private void saveFaunaFlora(String name,String detail,String img,String type,String trail){
        faunaService.setFauna(name, detail, img, type, trail, new AsyncCallback<String>() {

            public void onFailure(Throwable caught) {
            }

            public void onSuccess(String result) {
                Info.display("Informazione", "Salvataggio eseguito correttamente");  
                BaseLayout.refreshMenu();
                BaseLayout.changeContent(new HomeLayout());
            }
        });
        
        
    }
    
    
    
}
